package com.example.service;

import com.example.pojo.Menu;
import com.baomidou.mybatisplus.extension.service.IService;
import com.example.vo.ResultVo;
import com.example.vo.respvo.MenuAuthenticationVo;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.List;

/**
 * <p>
 * 菜单表 服务类
 * </p>
 *
 * @author wsl
 * @since 2022-03-27
 */
public interface IMenuService extends IService<Menu> {
    /**
     * 获取菜单管理页面的数据
     * @param menuName
     * @param enabled
     * @return
     */
    ResultVo getMenus(String menuName, Integer enabled);

    /**
     * 导入菜单数据
     * @param file
     * @return
     */
    void importMenus(MultipartFile file);


    void exportMenus(HttpServletRequest request, HttpServletResponse response);

    /**
     * 查询用户可用菜单
     * @return
     */
    ResultVo getUserMenus(HttpServletRequest request);

    /**
     * 获取菜单需要的权限
     * @return
     */
    List<MenuAuthenticationVo> getMenuAuthentications();


    /**
     * 获取不需要任何角色权限，登录即可访问的菜单
     * @return
     */
    List<Menu> getNotRequireAuthMenus();


    /**
     * 获取需要经过权限认证的菜单.
     * @return
     */
    List<Menu> getRequireAuthMenus();

    /**
     * 获取菜单需要的权限角色
     * @param menus
     * @return
     */
    List<String> getMenusWithRole(List<String> menus);

    /**
     *获取选项列表的菜单数据
     * @return
     */
    ResultVo getMenuOptions();

    /**
     * 获取前端菜单
     * @return
     */
    ResultVo getFontMenus();

    /**
     * 查询是否存在同名菜单路由
     * @param id
     * @param path
     * @return
     */
    boolean hasSameMenuPath(Integer id, String path);

    /**
     * 判断请求路径是否被禁用
     * @return
     */
    boolean isDisabled(String path);

    /**
     * 判断是否是系统菜单
     * @param path
     * @return
     */
    boolean isSysMenu(String path);

    /**
     * 判断同级目录下是否存在相同名称的系统菜单
     * @param id
     * @param menuName
     * @param parentId
     * @return
     */
    boolean hasSameNameSiblingMenu(Integer id, String menuName, Integer parentId);

    /**
     * 修改菜单
     * @param menu
     * @return
     */
    ResultVo updateMenu(Menu menu);

    /**
     * 删除菜单
     * @param ids
     * @return
     */
    ResultVo deleteMenu(Integer[] ids);
}
